Финальный проект "Идентификация интернет-пользователей".

Выполнил: Павел Ананьев

Целью проекта является идентификация пользователя по его поведению в интернете, а конкретно по последовательности сайтов, которые этот пользователь посещает. Идея состоит в том, что разные люди предпочитают посещать разные сайты и по-разному с этими сайтами взаимодействовать. Таким образом, зная эти предпочтения, можно попробовать решать задачу, например, о выявлении несанкционированного доступа к аккаунту.

Проект разделен на несколько частей:

1. В первой части будем использовать данные из статьи "A Tool for Classification of Sequential Data". Данные получены с прокси-серверов Университета Блеза Паскаля и разделены на группы по количеству пользователей: 3, 10, 150 и 3000. Данные имеют следующий вид: для каждого пользователя есть отдельный файл, имеющий название userXXXX.csv, где XXXX - ID пользователя. Сам файл имеет всего 2 столбца: timestamp (время, в которое пользователь посетил сайт) и посещенный веб-сайт.
Задача в этой части — предобработка сырых данных, приведение их к виду, который можно использовать в предсказательных моделях.

2. Задача второй части — исследование и визуализация полученных в первой части данных, а также построение и исследование новых признаков, которые можно использовать для улучшения качества классификации.

3. В третьей части главной задачей будет являться выбор классификатора.

4. Четвёртая часть будет последней в проекте. Здесь задачей будет участие в этом соревновании. Данные в этом соревновании те же самые, но уже предобработаны. Каждая интернет-сессия пользователя здесь состоит из 10 сайтов либо ограничены по времени 30 минутами. Цель соревнования — как можно лучше опознать одного пользователя, Элис, среди всех остальных. Таким образом, будет решаться задача бинарной классификации с метрикой качества AUC ROC.

Часть 1.

Посмотрим как выглядят файлы с данными о посещенных пользователем веб-страницах.

Подготовим обучающую выборку

Для этого реализуем функцию prepare_train_set, которая принимает на вход путь к каталогу с csv-файлами path_to_csv_files и параметр session_length – длину сессии, а возвращает 2 объекта:

Будем составлять данные с длиной сессии 10 сайтов.

Проверим работоспособность функции.

Теперь применим эту функцию к наборам из 10 и 150 пользователей и посмотрим, сколько получится сессий и уникальных сайтов в таких данных.

Сохраним в файлы частоты сайтов.

Модифицируем выборку

Полученные признаки site1, ..., site10 имеют мало смысла как признаки в задаче классификации. Поэтому воспользуемся идеей мешка слов из анализа текстов. Создадим новые матрицы, в которых строкам будут соответствовать сессии из 10 сайтов, а столбцам – индексы сайтов. На пересечении строки $i$ и столбца $j$ будет стоять число $n_{ij}$ – cколько раз сайт $j$ встретился в сессии номер $i$. Сделаем эти матрицы разреженными.
Реализуем функцию для создания такой матрицы, а также модифицируем прошлую функцию для построения данных следующим образом.

Аргументы:

Модифицированная функция будет возвращать 2 объекта:

Создадим несколько выборок, которые нам пригодятся позже, для разных сочетаний параметров длины сессии и ширины окна. Все они представлены в табличке ниже:

session_length ->
window_size
5 7 10 15
5 v v v v
7 v v v
10 v v

Итого должно получиться 18 разреженных матриц – указанные в таблице 9 сочетаний параметров формирования сессий для выборок из 10 и 150 пользователей.

Результаты 1 части.

В этой части мы обработали данные о посещении сайтов для 10 и 150 пользователей. Реализовали функцию, которая получает на вход сырые данные каждого пользователя и выдаёт на выход одну разреженную матрицу интернет-сессий всех пользователей (мешок сайтов), а также метки пользователей. Такой формат данных позволит дальше использовать их в моделях машинного обучения.

Часть 2.

Исследование данных и проверка гипотез

Используем данные 10 пользователей.

Посмотрим на распределение целевого класса.

Посчитаем распределение числа уникальных сайтов в каждой сессии из 10 посещенных подряд сайтов и проверим, является ли оно нормальным.

Тест Шапиро-Уилка отвергает гипотезу о том, что величина распределена нормально.

Проверим гипотезу о том, что пользователь хотя бы раз зайдет на сайт, который он уже ранее посетил в сессии из 10 сайтов. Давайте проверим с помощью биномиального критерия для доли, что доля случаев, когда пользователь повторно посетил какой-то сайт (то есть число уникальных сайтов в сессии < 10) велика: больше 95%.

Полученное p-value позволяет отвергнуть нулевую гипотезу. Следовательно, можем сделать вывод, что пользователи с вероятностью больше 0.95 за время сессии зайдут повторно на какой-либо уже посещённый сайт.

Теперь построим 95% доверительный интервал для средней частоты сайтов в выборке на основе bootstrap. Реализуем для этого вспомогательные функции.

Построение признаков и визуализация данных

Тренировочные данные в текущем виде практически не несут в себе никакой информации, которую можно было бы визуализировать. Поэтому построим новые признаки:

Применим эту функцию к данным из 10 и 150 пользователей.

Теперь приступим к визуализации. Использовать будем данные для 10 пользователей, чтобы можно было смотреть на распределения признаков для каждого человека. Для удобства присвоим каждому id имя и свяжем с ним определённый цвет.

Создадим функции для отрисовки гистограмм. Для одиночных гистограмм будем использовать библиотеку plotly, а для множественных seaborn. (Множественные графики в plotly менее удобные).

1. Построим гистограмму распределения длины сессии в секундах (session_timespan). Ограничим по x значением 200 (иначе слишком тяжелый хвост)

Можно увидеть, что сессии зачастую очень короткие. Может просто случайный заход, например, автовосстановление прошлой сессии в браузере.

2. Построим гистограмму распределения числа уникальных сайтов в сессии (#unique_sites).

Распределение похоже на нормальное, но выше мы уже выяснили, что это не так. Самое частое количество сайтов — 7, также есть небольшой пик на значении 2.

3. Построим гистограммы распределения числа уникальных сайтов в сессии (#unique_sites) для каждого из 10 пользователей по отдельности. Используем цвета, которые назначили каждому пользователю.

4. Построим гистограмму распределения часа начала сессии (start_hour).

Из этого графика можно заметить, что есть 2 популярных времени для захода в интернет: в обед (14 часов) и утром (9-10 часов). Вечером в интернет заходят нечасто.

5. Построим гистограммы распределения часа начала сессии (start_hour) для каждого из 10 пользователей по отдельности.

6. Построим гистограмму распределения дня недели, в который началась сессия (day_of_week).

Чаще всего в интернет пользователи заходят в середине недели, а именно в среду, в конце недели заходят в интернет реже.

7. Построим гистограммы распределения дня недели, в который началась сессия (day_of_week) для каждого из 10 пользователей по отдельности.

Построим ещё распределение количества сессий по пользователю, чтобы узнать, кто из них чаще заходит в интернет.

Теперь посмотрим на графики, на которых содержится информация об отдельном пользователе, и сделаем некоторые выводы по каждому из них.

1. Ashley.

Имеет довольно много сессий в интернете и за каждую сессию чаще всего заходит на 7-8 уникальных сайтов, но есть выделяющийся пик на 1 сайте в сессии, возможно заходит проверить почту. Большинство её сессий приходится на среду. Возможно по средам она себе выделяет день, когда можно посидеть в интернете, либо это связано с работой (можно было бы посмотреть на какие сайты она в это время заходит). А вот в выходные она практически не заходит в интернет совсем. Скорее всего проводит выходные с друзьями или просто гуляет. Больше всего её сессий приходится на утро, с 8 до 11 часов. Вероятно, проверяет почту с утра, смотрит погоду, заходит в соцсети. Также есть выделяющийся пик на 14 часов, что скорее всего соответствует её обеденному времени.

2. Avril.

Тоже активный пользователь интернета. Чаще всего за время сессии заходит на 6 уникальных сайтов. Появляется в интернете каждый день, больше всего раз во вторник, среду и четверг. Возможно связано с работой. Также выделяет себе день для интернета в воскресенье. Больше всего сессий начинает в обеденное время 13-14 часов, а также вечером в 17.

3. Bill.

Имеет не очень много сессий в интернете. За их время заходит чаще всего на 8 разных сайтов, но есть небольшой пик на 1 сайте, который может быть связан с проверкой почты, погоды или соц сетей. Активен обычно в начале недели в понедельник и вторник, в остальные дни заходит в интернет меньше. Часто начинает сессии в 15 часов, а также заходит с утра 8-9 часов.

4. Bob.

Тоже не очень активный пользователь интернета. Самое частое количество сайтов в сессии 6 и в принципе распределение похоже на нормальное. Чаще всего бывает в интернете во вторник, четверг и пятницу (странное сочетание), а в выходные вообще в интернет не заходит. Обычно начинает сессии в 10 и 15 часов, что может соответствовать началу рабочего дня и обеденному перерыву.

5. Dick.

Редко заходит в интернет. Количество уникальных сайтов в сессии чаще всего 2. Что-то вроде сочетания погода + почта. На неделе выделяет себе субботу, чтобы посидеть в интернете, также активен в среду, но практически совсем не заходит в интернет в понедельник и четверг. Начинает сессии в совершенно разное время дня, но чаще всего в 9 и 16 часов.

6. Ed.

Самое маленькое количество сессий из расматриваемых 10 человек. Сессии обычно состоят из 7-8 сайтов. Во время рабочей недели с понедельника по пятницу заходит в основном только в среду, зато активен на выходных. Чаще всего начинает сессии в 16 часов, остальное время ничем не выделяется.

7. John.

Тоже является одним из неактивных пользователей. Обычное количество разных сайтов в сессии 7. Более менее активен в интернете во время рабочей недели с пиком в пятницу, а в выходные от интернета отдыхает. Начинает сессии в течение рабочего дня, чаще всего в 15 часов, и практически вообще не заходит в интернет вечером после 17. Возможно, во время работы Джону скучно, и он заходит посидеть в интернете время от времени, а после работы уже находит себе другое занятие.

8. Lindsey.

Довольно активный пользователь интернета. Большинство сессий состоят из 7 разных сайтов. Понемногу заходит в интернет каждый день, но чаще всего во вторник и среду, может у неё это выходные. Пик активности в течение дня приходится на обеденный перерыв 12 и 14 часов, а вот вечером пользуется интернетом нечасто.

9. Mary-Kate.

Обладает самым большим количеством сессий, но пик уникальных сайтов в сессии равен 2. Активна в интернете в течение всей недели, но очень много в нём сидит на выходных в субботу и воскресенье. Начинает сессии в интернете в течение всего дня, но чаще всего вечером в 20 часов, а также с утра 9-10 часов. Скорее всего не любит активный отдых и предпочитает сидеть дома и общаться с друзьями в интернете. Возможно очень активный пользователей соцсетей.

10. Naomi.

Довольно активно пользуется интернетом. Распределение уникалных сайтов похоже на нормальное с пиком в 6. Больше пользуется интернетом в будние дни, особенно в четверг, а вот в выходные меньше. Пик активности в течение дня приходится на обед в 14 часов, а также любит посидеть в интернете вечером перед сном.

Забавно получилось, что в этой выборке девушки чаще сидят в интернете, чем мужчины, хотя имена выбраны совершенно случайно.

Нарисуем barplot, показывающий частоты посещений топ-10 сайтов.

Самый популярный сайт youtube. Также в популярных сайтах facebook, google и его различные поддомены. (Намекает на то, что можно попробовать реализовать entity recognition)

Дальнейшее построение признаков.

Придумаем ещё несколько признаков уже на основе тех, что построены.

  1. Имеет смысл создать категорию времени суток, так как сам по себе час начала мало значим, а вот разделение на утро, день, вечер, ночь будет иметь больше информации.
  2. Также можно создать индикатор выходного дня, так как по предыдущим графикам было видно, что некоторые люди больше активны в будни, либо наоборот.
  3. Создать индикатор посещения сайтов соц. сетей.
  4. Ещё можно посмотреть, сколько времени от сессии занимает просмотр популярных сайтов и соцсетей и взять их отношение к времени сессии.

1. Построим признак времени суток.

Видим, что минимальное время начала сессий в 7 часов, а максимальное в 23. Поэтому будем разбивать этот промежуток времени на утро-день-вечер, и на всякий случай, если в новых данных появятся другие времена начала, промежуток с 0 до 6 часов пометим как "ночь". Возьмём интервалы 7-11, 12-17, 18-23 часов.

Из графика видно, что чаще всего пользователи заходят в интернет днём, а вот вечером предпочитают заниматься другими делами.

Посмотрим как это выглядит для каждого пользователя.

Видим, что картинки согласуются с предыдущей. Много пользователей часто начинают свои сессии днём, реже утром, и самое редкое вечером.

2. Построим признак индикатора выходного дня

На графиках можно увидеть, что мало пользователей предпочитают сидеть в интернете на выходных. Из всех 10 пользователей только Dick заходит в интернет на выходных чаще, чем в будни. У Mary-Kate и Ed разница между количеством сессий на выходных и в будни небольшая. Остальные заходят в интернет преимущественно в будние дни.

3. Посмотрим сколько раз за сессию пользователь заходит на сайты соцсетей.

В качестве таких сайтов рассмотрим facebook, youtube, instagram, twitter, а также все их поддомены.

Посмотрим на картинки

На графиках можно увидеть, что большинство пользователей ни разу не заходят на сайты соц.сетей за 10 сайтовую сессию. И в целом количество сессий с увеличением числа посещения соц. сетей уменьшается почти для всех пользователей, но есть те, кто выделяется. Например, Mary-Kate, которая, как мы выяснили раньше, является самым активным пользователем интернета, чаще всего бывает 4 раза на сайтах соц.сетей за 1 сессию. Dick тоже имеет знчительную часть сессий с 4 сайтами соц. сетей. Учитывая, что он очень любит заходить в интернет на выходных, возможно именно на них и приходятся такие сессии, а в будни он вероятно туда почти не заходит. Распределение Ashley похоже на распределение большинства, но у неё есть странный скачок на 10 сайтах соц. сетей в сессии. Видимо, она выделяет себе время, когда заходит в интернет исключительно ради соц. сетей.

4. Посмотрим на отношение проведённого времени на 30 самых популярных сайтах и в соц. сетях к общему времени сессии.

Посмотрим на картинки

Судя по всему, признак не очень информативный. Пользователи очень часто либо вообще не проводят время на популярных сайтах и в соц. сетях либо проводят там всю сессию. Возможно, признак будет более информативен если выбрать другую длину сессии. Однако и из этих графиков можно узнать, кто чаще предпочитает популярные сайты. Например, Mary-Kate, Dick и Avril. Ed и Lindsey имеют почти одинаковое количество сессий как без популярных сайтов так и только из популярных. Остальные похоже предпочитают сидеть на менее популярных сайтах.

Создадим функцию feature_engineering так, чтобы она выдавала все 4 построенные признака в одном DataFrame.

Результаты 2 части.

В этой части мы построили новые признаки на основе исходных и посмотрели на их визуализацию для данных 10 пользователей. На основе полученных графиков были сделаны выводы по каждому пользователю. Визуализация показала, что с помощью данных признаков возможно решить задачу по классификации пользователей по их поведению в интернете.

Часть 3.

Будем сравнивать между собой такие классификаторы как kNN (метод ближайших соседей), случайный лес, логистическая регрессия, SVM, а также посмотрим на реализацию логистической регрессии и SVM через стохастический градиентный спуск (SGD). Сравнивать их будем для начала на данных для 10 пользователей.

Разобьем выборку на 2 части. На одной будем проводить кросс-валидацию, на второй – оценивать модель, обученную после кросс-валидации.

Зададим заранее тип кросс-валидации: 3-кратная, с перемешиванием, параметр random_state=17 – для воспроизводимости.

Вспомогательная функция для отрисовки кривых валидации после запуска GridSearchCV (или RandomizedCV).

Создадим классификаторы.

Создадим вспомогательную функцию, которая будет принимать модель и выдавать оценку качества на кросс-валидации и на валидационном множестве, а также время обучения. В роли метрики качества будем использовать accuracy.

Лучшую точность на валидационном множестве (но не на кросс-валидации) показал метод SVM. Следом за ним идёт логистическая регрессия, как обычная, так и её реализация с помощью SGD. Однако SGD логистическая регрессия обучается намного быстрее, что поможет, когда данных станет намного больше, чем 10 пользователей. Случайный лес обучался дольше всех и при этом проигрывает по качеству линейным моделям. А метод kNN показывает себя совсем плохо. Таким образом рекомендуется использовать SGD логистическую регрессию, когда данных станет больше. Пока данных мало, попробуем понастраивать гиперпараметры у обычной логистической регрессии и SVM. У логистической регрессии есть специальный класс LogisticRegressionCV, для SVM воспользуемся поиском по сетке GridSearchCV.

Переберём теперь параметры в узком диапазоне.

Теперь посмотрим, как влияют на точность классификации длина сессии и ширина окна. В качестве классификатора возьмём SVM, так как он показал себя чуть лучше логистической регрессии. Реализуем вспомогательную функцию.

Для удобства создадим копии некоторых файлов с новыми названиями. Так как в цикле будем использовать имена файлов, нужно привести их к однообразию.

В полученных результатах есть некая закономерность, по которой изменяется доля неправильных ответов. Если зафиксировать ширину окна, а длину сессии увеличивать, то качество увеличивается. Если зафиксировать длину сессии, а ширину окна уменьшать, то качество также увеличивается. Посмотрим, как будут выглядеть результаты для данных 150 пользователей. Здесь возьмём не все варианты, а только пары (5, 5), (7, 7) и (10, 10).

Для данных 150 пользователей также сохраняется тенденция повышения качества при одновременном увеличении длины сессии и ширины окна. Возможно модель лучше может разделить пользователей, когда в их интернет сессиях больше разнообразия.

Результаты 3 части.

В этой части мы сравнили между собой несколько классификаторов. В результате сравнения несколько моделей показали схожее качество, но разное время обучения. Это даёт нам выбор между наилучшим качеством или качеством чуть хуже, но с наилучшим быстродействием. Также сравнили, как качество классификатора зависит от предобработки изначальных данных.

Часть 4.

Считаем данные соревнования в DataFrame train_df и test_df (обучающая и тестовая выборки).

Объединим обучающую и тестовую выборки – это понадобится, чтоб вместе потом привести их к разреженному формату.

В обучающей выборке видим следующие признаки:

- site1 – индекс первого посещенного сайта в сессии
- time1 – время посещения первого сайта в сессии
- ...
- site10 – индекс 10-го посещенного сайта в сессии
- time10 – время посещения 10-го сайта в сессии
- user_id – ID пользователя

Сессии пользователей в соревновании выделены таким образом, что они не могут быть длинее получаса или 10 сайтов. То есть сессия считается оконченной либо когда пользователь посетил 10 сайтов подряд, либо когда сессия заняла по времени более 30 минут.

Посмотрим на статистику признаков.

Пропуски возникают там, где сессии короткие (менее 10 сайтов). Скажем, если человек 1 января 2015 года посетил vk.com в 20:01, потом yandex.ru в 20:29, затем google.com в 20:33, то первая его сессия будет состоять только из двух сайтов (site1 – ID сайта vk.com, time1 – 2015-01-01 20:01:00, site2 – ID сайта yandex.ru, time2 – 2015-01-01 20:29:00, остальные признаки – NaN), а начиная с google.com пойдет новая сессия, потому что уже прошло более 30 минут с момента посещения vk.com.

В обучающей выборке – 2297 сессий одного пользователя (Alice) и 251264 сессий – других пользователей, не Элис. Дисбаланс классов очень сильный, и смотреть на долю верных ответов (accuracy) непоказательно. Вместо этого будем смотреть на метрику AUC ROC.

Для бейзлайна обучим модель, используя только индексы посещенных сайтов. Индексы нумеровались с 1, так что заменим пропуски на нули.

Создадим разреженные матрицы X_train_sparse и X_test_sparse аналогично тому, как мы это делали ранее. Также выделим вектор y ответов на обучающей выборке.

Разобьем обучающую выборку на 2 части в пропорции 7/3, причем не перемешивая. Исходные данные упорядочены по времени, тестовая выборка по времени четко отделена от обучающей, это же соблюдем и здесь.

Обучим SGD вариант логистической регрессии и, используя валидационное множество, посмотрим на качество предсказаний того, что данный пользователь — Элис.

Сделаем тот же самый прогноз для тестовой выборки, но модель обучим уже на всей обучающей выборке (а не на 70%). Пошлём эти предсказания на Kaggle.

Пробуем улучшить результат

С нашим бейзлайном получили результат 0.91646 на Kaggle. Нашей целью будет побить второй установленный бейзлайн, для этого необходимо получить как минимум 0.92784. Попробуем добавлять признаки, которые мы делали раньше.
Попробуем добавить следующие из ранее созданных признаков:

Посмотрим на визуализацию новых признаков.

1. Средняя длительность нахождения на сайте в сессии.

Распределения тренировочного и тестового множества похожи. Большая часть всех значений лежит в районе 20 секунд. Дальше у распределения очень тяжёлый хвост.

Посмотрим распределения отдельно для Элис и остальных пользователей.

Распределения похожи. Разве что Элис находится на сайтах в среднем чуть меньше. Возможно, это позволит помочь распознать Элис.

2. Длительность сессии.

Опять у Элис в среднем время сессии меньше. Признак может помочь.

3. Количество уникальных сайтов в сессии.

В тестовой выборке больше сессий, где число уникальных сайтов меньше, чем в тренировочной, но незначительно

Элис чаще заходит на большое количество разных сайтов.

4. Час начала сессии.

Тренировочное и тестовое распределение похожи

По этому признаку Элис сильно отличается от других юзеров. Её пик активности 16-17 часов. Однако этот признак лучше объединить в меньшее количество категорий, чтобы избежать переобучения. Но пока что оставим так.

5. День недели.

В тестовой выборке побольше данных в выходные, чем в тренировочной

Элис больше, чем остальные юзеры активна в понедельник, совсем не активна по воскресеньям и слабо активна в среду и субботу.

Попробуем добавить эти признаки и обучить классификатор

Создадим несколько вспомогательных функций, которые позволят выборочно добавлять признаки в разреженную матрицу, а также получать качество модели на валидационном множестве вместе с кривыми обучения.

Создадим модель и для начала добавим к тренировочной выборке признаки start_hour и day_of_week.

Качество модели ухудшилось по сравнению с бейзлайном, хотя мы видели, что эти признаки должны помочь, так как они хорошо отделяют Элис от остальных. По кривым обучения можно увидеть, что решение модели в целом сходится, но на не слишком хорошем качестве.
Вспомним, что линейным моделям необходимо, чтобы все признаки были одного масштаба, иначе некоторые признаки будут получать слишком большие веса, а некоторые слишком маленькие, и качество будет хуже. Поэтому переделаем признаки start_hour и day_of_week в другие. Во-первых, построим на основе этих признаков новые: время суток и индикатор выходного дня. Во-вторых, сделаем one-hot encoding. Так как основная обучающая выборка состоит из нулей и единиц, то эти новые признаки будут иметь точно такой же масштаб.

Посмотрим, как модель справится с новыми признаками.

Качество заметно улучшилось, значит мы были правы. Кривые обучения показывают, что решение хорошо сходится, данных достаточно. Сделаем предсказания на тестовой выборке и отправим на Kaggle.

Эта модель даёт на Kaggle результат 0.94364. Цель достигнута, но можно попробовать улучшить ещё. У нас ещё остались неиспользованные признаки.

Попробуем их добавить в изначальном виде и посмотрим, что произойдёт.

Ожидаемо, качество сильно ухудшилось. Кривые обучения показывают, что модель вообще не справляется с задачей. Займёмся масштабированием всех признаков в отрезок [0, 1]. Для этого создадим функцию.

Добавлять одновременно признаки time_diff(n) и session_timespan бессмысленно, так как они линейно зависимы и включение их в модель вместе сделает только хуже. Поэтому добавим к тому, что уже есть только session_timespan и unique_sites.

Обучим модель с этими признаками.

Качество чуть ухудшилось по сравнению с предыдущей моделью. Попробуем понастраивать гиперпараметры. Проверим, какая модель покажет себя лучше, логистическая регрессия или SVM при разной степени регуляризации alpha. Зададим классификатору модель регуляризации elasticnet, где параметр l1_ratio определяет долю l2 и l1 регуляризации в модели (0 соответствует l2 модели, а 1 — l1). Также воспользуемся параметром class_weight. Его опция 'balanced' автоматически подбирает веса для различных классов при их сильном дисбалансе, который как раз у нас присутствует. С помощью этой опции модель будет как бы больше внимания уделять классу, которого в выборке меньше. Теоретически это должно помочь повысить качество.

Качество на валидации улучшилось. Попробуем отправить эти предсказания на Kaggle.

Оценка на kaggle, к сожалению, лучше не стала. Однако лучшая практика — выбирать модель по качеству на валидации, поэтому данная модель может обладать большей генерализацией. Но также есть вероятность того, что она просто переобучилась.

Результаты 4 части.

В этой части мы поучавствовали в соревновании на Kaggle. Провели исследование новых признаков и посмотрели, как некоторые из них помогают улучшить качество модели. Побили установленную цель в 0.92784 метрики AUC ROC.

Заключение

В данном проекте была рассмотрена задача идентификации пользователей в сети Интернет. За время проекта были реализованы следующие этапы:

  1. Предобработка данных.
  2. Построение новых признаков.
  3. Визуализация данных.
  4. Валидация моделей.
  5. Участие в соревновании Kaggle.

Было выяснено, что, имея данные по посещённым пользователями сайтам и времени посещения, можно построить модель, которая с хорошей точностью сможет отделить одного пользователя от всех остальных. Такую модель можно использовать, например, для обнаружения злоумышленников, которые взломали чужой аккаунт или для обнаружения ботов. Для реального применения желательно успевать обнаружить взломщика раньше, чем за 30 минут или 10 сайтов, поэтому можно пробовать разные виды предобработки данных. Также стоило бы наряду с ROC AUC максимизировать также метрику Recall, пусть даже за счёт Precision. Так как важнее поймать всех взломщиков, чем ошибочно попросить реального владельца аккаунта подтвердить личность.